import { Position } from './Position';
import { Tetromino } from './Tetromino';

/**
 * 游戏棋盘类
 * 标准俄罗斯方块：10列 x 20行
 */
export class GameBoard {
    public readonly width: number = 10;
    public readonly height: number = 20;
    private grid: (string | null)[][]; // null表示空，string表示颜色

    constructor() {
        this.grid = Array(this.height)
            .fill(null)
            .map(() => Array(this.width).fill(null));
    }

    /**
     * 检查位置是否有效（在棋盘范围内且未被占用）
     */
    isValidPosition(x: number, y: number): boolean {
        return x >= 0 && x < this.width && y >= 0 && y < this.height;
    }

    /**
     * 检查位置是否被占用
     */
    isOccupied(x: number, y: number): boolean {
        if (!this.isValidPosition(x, y)) {
            return true; // 边界外视为被占用
        }
        return this.grid[y][x] !== null;
    }

    /**
     * 检查方块是否可以放在指定位置
     */
    canPlaceTetromino(tetromino: Tetromino): boolean {
        const cells = tetromino.getCells();
        
        for (const cell of cells) {
            if (this.isOccupied(cell.x, cell.y)) {
                return false;
            }
        }
        
        return true;
    }

    /**
     * 将方块放置到棋盘上
     */
    placeTetromino(tetromino: Tetromino): void {
        const cells = tetromino.getCells();
        
        for (const cell of cells) {
            if (this.isValidPosition(cell.x, cell.y)) {
                this.grid[cell.y][cell.x] = tetromino.color;
            }
        }
    }

    /**
     * 检查并消除满行
     * @returns 消除的行数
     */
    clearLines(): number {
        let linesCleared = 0;
        
        for (let y = this.height - 1; y >= 0; y--) {
            if (this.isLineFull(y)) {
                this.removeLine(y);
                linesCleared++;
                y++; // 重新检查当前行（因为上面的行下移了）
            }
        }
        
        return linesCleared;
    }

    /**
     * 检查行是否满
     */
    private isLineFull(y: number): boolean {
        for (let x = 0; x < this.width; x++) {
            if (this.grid[y][x] === null) {
                return false;
            }
        }
        return true;
    }

    /**
     * 移除指定行，上面的行下移
     */
    private removeLine(y: number): void {
        // 从该行开始，将上面的行下移
        for (let i = y; i > 0; i--) {
            this.grid[i] = [...this.grid[i - 1]];
        }
        // 清空顶行
        this.grid[0] = Array(this.width).fill(null);
    }

    /**
     * 检查游戏是否结束（顶部有方块）
     */
    isGameOver(): boolean {
        // 检查顶部两行是否有方块
        for (let y = 0; y < 2; y++) {
            for (let x = 0; x < this.width; x++) {
                if (this.grid[y][x] !== null) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 获取指定位置的单元格颜色
     */
    getCell(x: number, y: number): string | null {
        if (!this.isValidPosition(x, y)) {
            return null;
        }
        return this.grid[y][x];
    }

    /**
     * 清空棋盘
     */
    clear(): void {
        this.grid = Array(this.height)
            .fill(null)
            .map(() => Array(this.width).fill(null));
    }

    /**
     * 获取棋盘的副本（用于调试）
     */
    getGrid(): (string | null)[][] {
        return this.grid.map(row => [...row]);
    }
}

